home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / object.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  5KB  |  230 lines

  1. /* --------------------------------- object.c ------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* maintain object lists.
  8. */
  9.  
  10. #include "plane.h"
  11.  
  12.  
  13. LOCAL_FUNC OBJECT * NEAR
  14. list_addobj (OBJECT *list[], ONAME name, int init, int attail)
  15. {
  16.     OBJECT    *obj;
  17.  
  18.     if (!NEW (obj))
  19.         return (0);
  20.     obj->name = name;
  21.     obj->id = ++st.object_id;
  22.     obj->flags |= F_NEW;
  23.     obj->shflags = SH(obj)->flags;
  24.     obj->rtime = st.present;            /* default time */
  25.     obj->tob = st.present;
  26.     obj->tom = st.present;
  27.     if (init) {
  28.         if ((st.bodies[name]->create)(obj)) {
  29.             DEL0 (obj);
  30.             return (0);
  31.         }
  32.     }
  33.  
  34.     if (attail || (obj->shflags & SH_BEHIT)) {    /* targets at end */
  35.         obj->next = 0;                /* f'ward chain */
  36.         obj->prev = list[TAIL];            /* b'ward chain */
  37.         if (list[TAIL])                /* if have list */
  38.             list[TAIL]->next = obj;        /* then link to tail */
  39.         else
  40.             list[HEAD] = obj;        /* else set head */
  41.         list[TAIL] = obj;            /* now new tail */
  42.     } else {
  43.         obj->next = list[HEAD];            /* f'ward chain */
  44.         obj->prev = 0;                /* b'ward chain */
  45.         if (list[HEAD])                /* if have list */
  46.             list[HEAD]->prev = obj;        /* then link to head */
  47.         else
  48.             list[TAIL] = obj;        /* else set tail */
  49.         list[HEAD] = obj;            /* now new head */
  50.     }
  51.  
  52.     ++st.nobjects;
  53.     return (obj);
  54. }
  55.  
  56. extern OBJECT * FAR
  57. create_object (ONAME name, int init)
  58. {
  59.     return (list_addobj (&CO, name, init, 0));
  60. }
  61.  
  62. extern OBJECT * FAR
  63. create_land (ONAME name)
  64. {
  65.     return (list_addobj (&CL, name, 1, 1));
  66. }
  67.  
  68. LOCAL_FUNC OBJECT * NEAR
  69. list_delobj (OBJECT *list[], OBJECT *object)
  70. {
  71.     if (!object)
  72.         return (0);
  73.  
  74.     (st.bodies[object->name]->delete) (object);
  75.  
  76.     if (object->pointer)
  77.         object->pointer = pointer_release (object->pointer);
  78.  
  79.     if (object->viewport)
  80.         DEL0 (object->viewport);
  81.  
  82.     if (object->e_type) {
  83.         if (ET_PLANE == object->e_type)
  84.             DEL0 (EE(object));
  85.         else if (ET_IMPORTED == object->e_type)
  86.             DEL0 (EIM(object));
  87.         else if (ET_BOMB == object->e_type)
  88.             DEL0 (EBM(object));
  89.         else
  90.             {}        /* should not happen! */
  91.         object->e_type = 0;
  92.     }
  93.  
  94.     if (object->next)        /* not last, fix b'ward chain */
  95.         object->next->prev = object->prev;
  96.     else                /* last, new tail */
  97.         list[TAIL] = object->prev;
  98.     if (object->prev)        /* not first, fix f'ward chain */
  99.         object->prev->next = object->next;
  100.     else                /* first, new head */
  101.         list[HEAD] = object->next;
  102.  
  103.     object->id = 0;
  104.     
  105.     --st.nobjects;
  106.     return (DEL (object));
  107. }
  108.  
  109. extern OBJECT * FAR
  110. delete_object (OBJECT *object)
  111. {
  112.     return (list_delobj (&CO, object));
  113. }
  114.  
  115. extern OBJECT * FAR
  116. delete_land (OBJECT *object)
  117. {
  118.     return (list_delobj (&CL, object));
  119. }
  120.  
  121. extern void FAR
  122. list_clear (OBJECT *list[])
  123. {
  124.     OBJECT    *p;
  125.  
  126.     if (list[HEAD]) {
  127.         for (p = list[HEAD]; p;)
  128.             p = delete_object (p);
  129.         list[HEAD] = list[TAIL] = 0;
  130.     }
  131. }
  132.  
  133. extern void * FAR
  134. shape_free (VERTEX *vx)
  135. {
  136.     int    n;
  137.  
  138.     if (vx) {
  139.         for (n = 0; vx[n].flags; ++n)
  140.             ;
  141.         memory_cfree (vx, sizeof (*vx), n+1);
  142.     }
  143.     return (NULL);
  144. }
  145.  
  146. LOCAL_FUNC int NEAR
  147. shape_line (char *VxFileName, FILE *vxfile, char *line, int linesize, long *l)
  148. {
  149.     do {
  150.         fgets (line, linesize, vxfile);
  151.         if (ferror (vxfile)) {
  152.             LogPrintf ("%s %ld: shape read error\n",
  153.                 VxFileName, *l);
  154.             return (1);
  155.         }
  156.         ++*l;
  157.     } while ('\n' == line[0] || '#' == line[0]);
  158.  
  159.     return (0);
  160. }
  161.  
  162. extern int FAR
  163. shape_read (SHAPE *shape, char *VxFileName)
  164. {
  165.     int    i, n, fine, resp;
  166.     long    l;
  167.     FILE    *vxfile;
  168.     VERTEX    *vx;
  169.     char    line[256], *p;
  170.  
  171.     for (p = line; *VxFileName; ++p, ++VxFileName)
  172.         *p = tolower (*VxFileName);
  173.     *p = '\0';
  174.     
  175.     Sys->BuildFileName (st.filename, st.fdir, line, SHP_EXT);
  176.     vxfile = fopen (st.filename, RTMODE);
  177.     if (!vxfile) {
  178.         LogPrintf ("missing shape file: %s\n", st.filename);
  179.         return (1);
  180.     }
  181.  
  182.     l = 0;
  183.  
  184.     if (shape_line (st.filename, vxfile, line, sizeof (line), &l)) {
  185.         fclose (vxfile);
  186.         return (0);
  187.     }
  188.  
  189.     resp = sscanf (line, "%d %d", &n, &fine);
  190.     if (2 != resp || n <= 0 || fine < 1 || fine > 2) {
  191.         LogPrintf ("%s %ld: bad shape size/detail\n", st.filename, l);
  192.         fclose (vxfile);
  193.         return (1);
  194.     }
  195.  
  196.     vx = (VERTEX *)memory_alloc ((n+1)*sizeof (*vx));
  197.     if (!vx) {
  198.         LogPrintf ("%s %ld: no shape memory: %s\n", st.filename, l);
  199.         fclose (vxfile);
  200.         return (1);
  201.     }
  202.  
  203.     for (i = 0; i < n; ++i) {
  204.         if (shape_line (st.filename, vxfile, line, sizeof (line), &l)) {
  205.             shape_free (vx);
  206.             fclose (vxfile);
  207.             return (1);
  208.         }
  209.         resp = sscanf (line, "%hd %hd %hd %hd",
  210.             &vx[i].V[X], &vx[i].V[Y], &vx[i].V[Z], &vx[i].flags);
  211.         if (4 != resp) {
  212.             LogPrintf ("bad shape line %d: %s\n", l, st.filename);
  213.             shape_free (vx);
  214.             fclose (vxfile);
  215.             return (1);
  216.         }
  217.     }
  218.     fclose (vxfile);
  219.  
  220.     vx[i].flags = 0;    /* end of list */
  221.     shape->v = vx;
  222.     shape->flags |= SH_DYNVERTEX;
  223.     if (fine & V_FINE)
  224.         shape->flags |= SH_FINE;
  225.  
  226.     LogPrintf ("Shape    %s size %d\n", st.filename, n);
  227.  
  228.     return (0);
  229. }
  230.